#!/bin/sh
# -*- AWK -*-
# Extract all examples from the manual source.
# Copyright (C) 1992, 2005-2014, 2016-2017, 2020-2021 Free Software
# Foundation, Inc.
#
# This file is part of GNU M4.
#
# GNU M4 is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GNU M4 is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.

# This script was designed under GNU awk, but hopefully portable to
# other implementations.

FILE=${1-/dev/null}
: ${AWK=awk}

$AWK '

BEGIN {
  node = "";
  seq = -1;
  count = 0;
  file = "NONE";
  status = 0;
  options = "";
  xout = "";
  xerr = "";
}

/^@node / {
  if (seq > 0)
    printf(" --  %d file%s", seq, seq == 1 ? "" : "s");
  if (seq >= 0)
    printf("\n");

  split($0, tmp, ",");
  node = substr(tmp[1], 7);
  if (length(node) > 10)
    printf("Node: %s - truncated", node);
  else
    printf("Node: %s ", node);
  gsub(" ", "_", node);
  node = tolower(substr(node, 1, 10));
  seq = 0;
}

/^@comment ignore$/ {
  getline;
  status = 0;
  options = "";
  xout = "";
  xout = "";
  next;
}

/^@comment status: / {
  status = $3;
}

/^@comment options: / {
  options = $0;
  gsub ("@comment options:", "", options);
}

/^@comment xout: / {
  xout = $0;
  gsub ("@comment xout: ", "", xout);
}

/^@comment xerr: / {
  xerr = $0;
  gsub ("@comment xerr: ", "", xerr);
}

/^@example$/, /^@end example$/ {
  if (seq < 0)
    next;
  if ($0 ~ /^@example$/) {
    if (count > 0)
      close (file);
    seq++;
    count++;
    file = sprintf("%03d.%s", count, node);
    printf("dnl @ %s:%d: Origin of test\n"\
           "dnl @ expected status: %d\n"\
           "dnl @ extra options: %s\n"\
           "dnl @ Copyright (C) 2006, 2007, 2008, 2009 Free Software\n"\
           "dnl @ Foundation, Inc.\n"\
           "dnl @ This file is free software; the Free Software Foundation\n"\
           "dnl @ gives unlimited permission to copy and/or distribute it\n"\
           "dnl @ with or without modifications, as long as this notice\n"\
           "dnl @ is preserved.\n", FILENAME, NR, status, options) > file;
    if (xout)
        printf("dnl @ expected output: %s\n", xout) > file;
    if (xerr)
        printf("dnl @ expected error: %s\n", xerr) > file;
    status = 0;
    options = "";
    xout = "";
    xerr = "";
    next;
  }
  if ($0 ~ /^@end example$/) {
    next;
  }
  if ($0 ~ /^\^D$/)
    next;
  if ($0 ~ /^\$ @kbd/)
    next;
  if ($0 ~ /^@result\{\}/ || $0 ~ /^@error\{\}/)
    prefix = "dnl ";
  else
    prefix = "";
  gsub("@@", "@", $0);
  gsub("@[{]", "{", $0);
  gsub("@}", "}", $0);
  gsub("@w[{] }", " ", $0);
  gsub("@tabchar[{]}", "\t", $0);
  printf("%s%s\n", prefix, $0) >> file;
}

END {
  printf("\n");
  if (count > 0)
    close(file);
}
' $FILE
